package com.Reactor3参考文档;

import java.io.IOException;

import org.junit.Test;

import reactor.core.Exceptions;
import reactor.core.publisher.Flux;

// 一般来说，一个 不受检异常（Unchecked Exception） 总是由 onError 传递。例如， 在一个 map 方法中抛出 RuntimeException 会被翻译为一个 onError 事件
public class ExceptionsDemo {

	// 下面是一个 map 的例子，它使用的 convert 方法会抛出 IOException：
	public String convert(int i) throws IOException {
	    if (i > 3) {
	        throw new IOException("boom " + i);
	    }
	    return "OK " + i;
	}

	// 现在想象你将这个方法用于一个 map 中，你必须明确捕获这个异常，并且你的 map 方法不能再次抛出它。 所以你可以将其以 RuntimeException 的形式传递给 onError：
	@Test
	public void test(){
		Flux<String> converted = Flux
		    .range(1, 10)
		    .map(i -> {
		        try {
		        	return convert(i);
		        } catch (IOException e) {
		        	throw Exceptions.propagate(e);
		        }
		    });
		// 当后边订阅上边的这个 Flux 并响应错误（比如在用户界面）的时候，如果你想处理 IOException， 你还可以再将其转换为原始的异常。如下
		converted.subscribe(
		    v -> System.out.println("RECEIVED: " + v),
		    e -> {
		        if (Exceptions.unwrap(e) instanceof IOException) {
		            System.out.println("Something bad happened with I/O");
		        } else {
		            System.out.println("Something bad happened");
		        }
		    }
		);
	}

}
